结构模式-桥接模式
什么是桥接模式?
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。(合成\聚合 复用原则)
这里 UML 图的 Abstraction 和 Implementor 应该是水平的,但是这个 mermaid
作的图好像无法设置为水平(下面 “手机品牌” 和 “手机软件” 同理)...
classDiagram
Abstraction <|-- RefinedAbstraction
Abstraction o--> Implementor
Implementor <|-- ConcreteImplementorA
Implementor <|-- ConcreteImplementorB
Abstraction: +operation()
RefinedAbstraction: +operation()
Implementor: +operationImp()
ConcreteImplementorA: +operationImp()
ConcreteImplementorB: +operationImp()
就是在 Abstraction 与 Implementor 之间架设一座桥(聚合线),其中 Abstraction 为抽象化角色(不一定要特地抽象出一个类,可以直接一个类解决)它定义出该角色的行为,同时保存对实现类(Implementor)的引用
如果上面的类图不太好懂,下面举个书上原本的例子,就比较明白了
先使用类结构型模式的方式编写一个 手机-软件 的 UML 图
classDiagram
手机品牌 <|-- 手机品牌A
手机品牌 <|-- 手机品牌B
手机品牌A <|-- 手机品牌A的通讯录
手机品牌A <|-- 手机品牌A的游戏
手机品牌B <|-- 手机品牌B的通讯录
手机品牌B <|-- 手机品牌B的游戏
如上所示,软件供应商需要为每个手机品牌都创建一套它们的专属的软件,而如下采用了桥接的方式,软件供应商只需去实现这个 “手机软件” 接口,就能给所有品牌的手机使用
classDiagram
手机品牌 <|-- 手机品牌A
手机品牌 <|-- 手机品牌B
手机品牌 o-- 手机软件
手机软件 <|-- 通讯录
手机软件 <|-- 游戏
对于有两个独立变化的维度,且这两个维度都需要进行扩展的情况下(例如这里的 “手机品牌” 和 “手机软件” 都有可能会变化),桥接的方式优于继承的方式
实例
说白了就是内嵌一个对象进来